﻿#include "ctooltip.h"
#include <QDebug>
#include <QApplication>
#include <QDesktopWidget>
#include <QMouseEvent>

//初始化
bool CToolTip::_onShow = false;
QString CToolTip::_currentShowText = "";

CToolTip::CToolTip(QWidget *parent) :
    QWidget(parent)
{
    this->setWindowFlags(Qt::ToolTip | Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint);
//    setAttribute(Qt::WA_TranslucentBackground, true);
//    setAttribute(Qt::WA_DeleteOnClose);//关闭后删除对象
//    this->resize(200, 100);

    this->setObjectName("CToolTip");
    this->setStyleSheet("QWidget#CToolTip {border: 2px solid green; background-color: grey;}");

    // 开启鼠标实时追踪
//    setMouseTracking(true);
    this->installEventFilter(this);

//    groupBox = new QGroupBox(this);
//    groupBox->setGeometry(10, 10, 180, 80);
//    groupBox->setTitle("用户信息");

//    labelIcon = new QLabel(groupBox);
//    labelName = new QLabel(groupBox);
    labelInfo = new QLabel(this);

//    verlayout = new QVBoxLayout();
//    verlayout->setContentsMargins(0, 0, 0, 0);
//    verlayout->addWidget(labelName);
//    verlayout->addWidget(labelInfo);

    horLayout = new QHBoxLayout(this);
//    horLayout->setContentsMargins(10, 10, 10, 10);
//    horLayout->addWidget(labelIcon, 1, Qt::AlignTop);
    horLayout->addWidget(labelInfo);
//    horLayout->addLayout(verlayout, 4);
}

CToolTip::~CToolTip()
{
    _onShow = true;
    killTimer(m_timerId);
}

// 显示ToolTip消息
void CToolTip::showMessage(QString info, QPoint point) {
    labelInfo->setText(info);

    // 重新定义CToolTip的坐标
    int rectX;
    int rectY;
    if (point.rx() < 200) {
        rectX = point.rx() + 10;
    } else {
        rectX = point.rx() - 30;
    }
    rectY =  point.ry() + 15;
//    rectX = point.x();
//    rectY = point.y();
    move(QPoint(rectX, rectY));
    this->show();
    this->raise();
}

// 当鼠标进入事件时，让界面隐藏掉
void CToolTip::hoverEvent(QHoverEvent *) {
    hide();
}

bool CToolTip::eventFilter(QObject *obj, QEvent* e)
{
    //失去焦点后自动消失：
    if (obj == this){
        if (QEvent::WindowDeactivate == e->type()){
//            killTimer(m_timerId);
            showTimer.stop();
            this->close();
            CToolTip::_onShow = false;
            e->accept();
        }
        //监控关闭事件：
        if (QEvent::Close == e->type()){
            //改变全局标志位：
            _currentShowText = "";
            CToolTip::_onShow = false;
        }
        //监控显示事件：
        if (QEvent::Show == e->type()){
            //改变全局标志位：
            CToolTip::_onShow = true;
//            m_timerId = this->startTimer(3000, Qt::PreciseTimer);//3s后消失
            if(!showTimer.isActive()){
                showTimer.start(3000, this);
            }

        }
        if (QEvent::Enter == e->type()){
            //改变全局标志位：
//            killTimer(m_timerId);
            showTimer.stop();
            this->close();
            e->accept();
        }
    }
//    if (QEvent::MouseButtonPress == e->type()){
//        //改变全局标志位：
////            killTimer(m_timerId);
//        showTimer.stop();
//        this->close();
//        e->accept();
//    }
//    if (QEvent::MouseMove == e->type()){
//        auto mouseEvent = static_cast<QMouseEvent*>(e);
//        //计算与弹出点的坐标距离
//        auto dPos = mouseEvent->globalPos() - _PopUpPos;
//        float DisTance=sqrt(dPos.x()*dPos.x()+dPos.y()*dPos.y());
//        //当前鼠标位置距离超过200时，自动关闭
//        if(DisTance>200)
//        {
//            _currentShowText = "";
//            CToolTip::_onShow = false;
//            this->close();
//        }
//    }
    return QWidget::eventFilter(obj, e);
}

void CToolTip::popup(QString text, QPoint pos)
{
    qDebug()<<"被调用！！！！！！！！";
    //如果正在显示且显示文字相同，不做改变：
    if(_onShow && (text == _currentShowText))
    {
        qDebug()<<"不动作";
    }
    //否则显示新弹框：
    else
    {
        qDebug()<<"触发显示";
//        CToolTip *t = new CToolTip();
        //记录弹出位置：
        _PopUpPos = pos;
//        //设置弹出的文字，保存当前的文字
        _currentShowText = text;
//        t->setText(text);
//        t->show();
        //显示一个偏移量：
//        t->move(pos+QPoint(20,20));
        showMessage(text, pos);
    }
}

void CToolTip::timerEvent(QTimerEvent * tEvent)
{
    if (tEvent->timerId() == showTimer.timerId()){
        showTimer.stop();
        this->close();
    }
}
